PIC18 電圧計/温度計
PIC18シリーズは、12Fや16Fシリーズとは コンパイラとプログラムの書式が若干異なるが、ADコンバーター、通信、INT入力等の機能が充実し、フラッシュメモリ、RAMの容量も大きく、8 ビットマイコンのハイエンド機種の位置付けにある。 とりわけ、PIC18F14K50、18F2550、18F4550などは別名”USBマイコン”ともいわれ、入手しやすい USB内蔵マイコンである。
1. MPLAB C18 のダウンロード と セットアップ:
・ PIC18シリーズ用の Cコンパイラは、マイクロチップテクノロジー社のウェブページから 評価版(無償、60日で最適化の機能が無くなる)をダウンロードする。(ダウンロードのための登録記入が必要。
また、”学習版”は最適化の機能がなくなったものと同じ)
http://www.microchip.com/ → Development Tools → Compilers → MPLAB C Compiler for PIC18
MCUs → ・・・ Standard-Eval Version(=評価版)
・ MPLAB C18を MPLAB IDE から使うには、@ MPLAB IDEに実行ファイル(.exe)の位置を知らせ、A ヘッダとライブラリの検索パスを設定する必要がある。
MPLAB IDEを起動し、 [Project] → [Set Language Tool
Location] → [Microchip C18 Toolsuite]
@ (実行ファイルの選択) [Executables] の下層項目で、[Brows]で選択 (起動ドライブをCと仮定して、)
MPLAB C18 C Compiler:
C:\MCC18\bin\mcc18.exe
MPLIB Librarian:
C:\Program Files\Microchip\MPASM Suite\mplib.exe
MPLINK Object Linker: C:\Program
Files\Microchip\MPASM Suite\mplink.exe
A (検索パスの設定) [Default Search Path] で、
[Include Search
Path]: (ヘッダ) C:\MCC18\h
[Library Search
Path]: (フォルダ) C:\MCC18\lib を選択
* 実行ファイル、検索パスの関連付け(@、A)は、C18コンパイラのアセンブラ、ライブラリアン、リンカ
(C:\Program Files\Microchip\mplabc18\bin\mcc18.exe、 C:\Program Files\Microchip\mplabc18\bin\mplib.exe、 C:\Program
Files\Microchip\mplabc18\bin\mplink.exe、C:\Program Files\Microchip\mplabc18\h、 C:\Program
Files\Microchip\mplabc18\lib) のようにしても良い。
・ プロジェクト作製では、プロジェクトウィザードから開き、言語では Microchip
C18 ToolSuite を選択する。(その他は PIC16と同様) ビルドは、Make
ボタンで行なう。
・ hex. ファイルのPICへの書き込みは、 PIC kit 2 または 3 で問題なく行なえるが、これが無くても USBコネクタを接続しておけば、ブートローダをパソコンから書き込むことができる。
(メモリ比較)
PIC18F14K50 フラッシュ(プログラムメモリ): 16kバイト、 RAM: 768バイト、 EEPROM: 256バイト
PIC18F2550 32kバイト、
2048バイト、 256バイト
PIC18F4550 32kバイト、 2048バイト、 256バイト
cf. PIC16F675 1kワード(1ワード=14ビット)、 64バイト、 128バイト
PIC16F628A
2kワード、 224バイト、 128バイト
PIC16F877A
8kワード、 368バイト、 256バイト
2. PIC18F14K50 LCD表示電圧計の作製:
PIC18F14K50 (20pin)は価格(200円前後)の割りに機能が充実し、フラッシュメモリ、RAM容量も充分ある。 ここではまず、
ADコンバーター と LCD表示を含む 簡易電圧計を作製した。
アナログ入力 AN8、9 を使い、INT0、1入力、CCP1出力ピンを取っておくために、LCDの DB4〜7 に接続する端子には RB4〜7 を用いた。(シリアル通信(TX、RX) を用いる場合は、RC4〜7 を用いる。 因みに、RA0、1、3は入力専用で出力用にできない。) LCDは通常用いてきた SC1602B(16文字×2行キャラクター液晶)を使用。
内部発振(4MHz → 動作1MHz)に設定したので、ここではセラミック発振子や水晶は使わない。発振子を使用する場合の最高速度は
12MHz 発振で 内部 PLLにより48MHzとなり、USB2.0のフルスピード(12Mビット/秒)に対応する。
USBコネクタは、Bタイプを用いるべきで、ここではミニBを用いたので、これには1.5mmtのプリント基板の厚み程度のピンの長さしかなく、加工が難しかった。(ピンすべてにφ.2程度のメッキ線を半田付けしてから穴に差込み伸ばす)
電池電源からのセルフパワーが切れた際に、USBコネクタの1ピンからの パソコンのバスパワー(5V電源)に切り替えるための回路を付け加えた。これは、セルフパワーがつながっている場合は、バスパワーからの電流はFET(2SJ680、2.5A、ON抵抗1.6Ω)によって阻止され、セルフパワーのみによる供給が行なわれる。逆流防止用の
ショットキーダイオード(1S4)は電圧降下が0.2V程度と低いのでこれを用いる。(他のシリコンダイオードでは0.6V)
3. C18のプログラム:
コンフィグレーションの書式は、PIC12や16シリーズとかなり異なっていて、項目が多く とっつきにくい。
ピンの機能を一括管理するレジスタのようなものは存在せず、それぞれの機能ごとに有効/無効を設定する。(概して、アナログがデジタルよりも優先、入力が出力よりも優先)
時間を規定する delays 関数は、ライブラリのヘッダファイルをそのまま呼び出す。 内部クロック4MHz(動作クロック1MHz)なので、時間の最小単位は
Delay1TCY( ) = 1μS となる。
LCD表示のための関数は、PIC16シリーズと同じように ソースファイルに入れたが、決まりきっているので
同じプロジェクトフォルダに入れて、ヘッダーファイルとして呼び出すこともできる。
(LCD用のヘッダーファイル群は MPLAB、C18の ライブラリにもあるが、使い方が煩雑で
一般にもあまり用いられていない)
ケースバイケースで小数点を入れて10進表示するための lcd_putv( ) のような関数は、ソースファイルに書いた方が 書き換えに便利である。
(コンフィグレーションと 液晶表示関数部分)
ADコンバータのプログラムは、あらかじめ プロジェクト・フォルダ(メモ帳ファイルとして保存)に入れておいて、そこからヘッダーファイル lib_adc.h として取り込み、メイン関数のループの中で初期化(基準電圧選択、チャンネル選択、データの右寄せなど)をする。
PIC18F14K50では、ADコンバータの選択を ANSEL と ANSELH で、1:1対応で簡単に行なえる。(PIC18F2550では ADCON1の設定が必要)
ADコンバータの参照電圧に Vdd と Vss(GND) の差 = 5V (ADC_REFの記述)としたので、この回路の場合はレギュレータの電源電圧の安定化が精度のポイントとなる。参照電圧に 電圧リファレンスIC(TL431など)を使ったほうがさらに良い。
変換されたデータは10ビットで、ADRESH(上位8ビット) と ADRESL(下位8ビット) に分けられてレジスタに入るので、それを2バイト(16ビット)に宣言された int変数( v 等)に読み込む。
* この際注意すべきことは、 v = (ADRESH << 8)|ADRESL のようにシフトレジスタで行なうと、データの取り込みが不安定になって表示がふらつくので、
v = (ADRESH * 256) + ADRESL のように演算式にする。
変換データは、5Vを1024分割した単位になっているので、49を掛けて5桁の数値とし、そのまま2番目に小数点を入れて表示する。 アッテネーター等を付けた場合は、倍率を変化させる。いずれにしても、216 − 1 = 65535 をオーバーフローしないように気をつける。オーバーフローする場合は、Bresenham
アルゴリズムにより計算することができる。( → PIC応用回路(3)A ) (* さらに桁数が多い場合は初めから long 変数 を使用)
(メイン関数部分: AD変換、LCD表示)
チャンネルの片側がOPENになっていると、電気的な原因で表示がふらつくので、アースと短絡しておく。アッテネータや温度計測用ICなど、抵抗を介してアースに落とす場合は問題ない。
デジタルテスターとの同時測定結果より、ADコンバータ単独の性能は、0.5V以下では上に凸の曲線となって歪むので、(通常行なわれているように、)オペアンプ(NJU7032D、LM358Nなど)の 増幅器+差動アンプ・バッファ を前段に付けて、5〜10倍(= 1〜4.5V程度)にしてからPICに入れたほうが良いと思われる。
1V〜4.5Vでは直線性はまあOK。
● ソース: lib_adc.h:
4. 温度計と切り替えスイッチの追加:
温度センサIC としては、出力電圧が摂氏温度に比例して使いやすい LM35DZ(温度(℃)×10 = ○○○mV、 0〜100℃)を用いた。このため、10進表示関数
putv() を直して putt() として、○○.○(℃) の表示とした。刻みは0.5℃くらい。
また、タクトスイッチによって、先の電圧計表示と、この温度計表示を切り替えるために、INT0による割込み関数を作製した。
PIC18F14K50 の外部割込み用の入力ピン( INTピン)は3本あり、また、タイマー0、1、2、3、 ADコンバータ変換終了、コンパレータ比較完了、キャプチャ/コンペア、シリアル送受信完了、I2C/SPI各種動作、USB各種動作など、一通りの割込み機能を持っている。中でも PIC12、16よりも改良された点は、割り込みの優先順(高優先、低優先のみ)がつけられることである。
ここでは、スイッチ1個だけで、タイマー割込みなどを使わないので、優先順の無い
単純割込みで行なうことにする。(INT0は 常時 高優先となる)
割込みベクタのアドレスを指定する際、 goto という分岐命令(ジャンプ命令)は、唯一、C言語では困難な文法であり、わざわざアセンブリー言語に直してから行なう。
● ソース: lib_adc.h: